//
// Created by WWR on 2025/8/24.
//

#include "rgb.h"
#include "W9825G6.h"

// 以下代码仅仅用于测试LTDC，不参与LVGL绘图
void LTDC_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint32_t color)
{
    uint32_t psx,psy,pex,pey;
    uint32_t timeout=0;
    uint16_t offline;
    uint32_t addr;
    // 按屏幕使用方式对坐标进行变换
    if(1)// 横屏
    {
        psx=sx;psy=sy;
        pex=ex;pey=ey;
    }else // 竖屏
    {
        psx=sy;psy=LCD_Height-ex-1;
        pex=ey;pey=LCD_Height-sx-1;
    }
    offline=LCD_Width-(pex-psx+1);
    addr=((uint32_t)SDRAM_BANK_ADDR+2*(LCD_Width*psy+psx));
    DMA2D->CR&=~(DMA2D_CR_START);
    DMA2D->CR=DMA2D_R2M;
    DMA2D->OOR=offline;
    DMA2D->OMAR=addr;
    DMA2D->NLR=(pey-psy+1)|((pex-psx+1)<<16); //设定行数寄存器
    DMA2D->OCOLR=color; //颜色输入地址
    DMA2D->CR|=DMA2D_CR_START; //启动 DMA2D
    while((DMA2D->ISR&(DMA2D_FLAG_TC))==0) //等待传输完成
    {
        timeout++;
        if(timeout>0X1FFFFF)break;//超时判断
    }
    DMA2D->IFCR|=DMA2D_FLAG_TC;//清除传输完成标志
}

void LTDC_Color_Fill(uint16_t sx,uint16_t sy,uint16_t ex,uint16_t ey,uint16_t* color)
{
    uint32_t psx,psy,pex,pey;
    uint32_t timeout=0;
    uint16_t offline;
    uint32_t addr;

    // 按屏幕使用方式对坐标进行变换
    if(1) // 横屏
    {
        psx=sx;psy=sy;
        pex=ex;pey=ey;
    }else // 竖屏
    {
        psx=sy;psy=LCD_Height-ex-1; // 272为屏幕高度像素
        pex=ey;pey=LCD_Height-sx-1;
    }
    offline=LCD_Width-(pex-psx+1);// 480为屏幕宽度像素
    addr=((uint32_t)SDRAM_BANK_ADDR+2*(LCD_Width*psy+psx)); // 2为像素字节大小，480为屏幕宽度像素
    DMA2D->CR&=~(DMA2D_CR_START); //停止DMA2D
    DMA2D->CR=DMA2D_M2M; //DMA2D配置为内存到内存
    DMA2D->FGMAR=(uint32_t)color; // 需要传输的颜色数据地址
    DMA2D->OMAR=addr; //输出存储器地址
    DMA2D->FGOR=0; // 前景层偏移
    DMA2D->OOR=offline; //行偏移
    DMA2D->NLR=(pey-psy+1)|((pex-psx+1)<<16); //设定行数寄存器
    DMA2D->CR|=DMA2D_CR_START; //启动 DMA2D
    while((DMA2D->ISR&(DMA2D_FLAG_TC))==0) //等待传输完成
    {
        timeout++;
        if(timeout>0X1FFFFF)break;//超时退出
    }
    DMA2D->IFCR|=DMA2D_FLAG_TC;//清除传输完成标志
}
